package DAO;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

import ConexaoBackupBD.ConexaoBD;
import ConexaoBackupBD.MetodosVerificacaoBD;
import BD.LinhaPesquisaBD;

public class LinhaPesquisaDAO {
    
    //Conexão com o banco de dados
    ConexaoBD conBD = new ConexaoBD();
    
    //Métodos autoincremento e unique
    MetodosVerificacaoBD metBD = new MetodosVerificacaoBD();
    
    Statement BDLp;
    ResultSet rs;
    
    public int autoIncremento(){
        return metBD.autoIncremento("linhapesquisa", "cod_linhapesquisa");
    }

    public List<LinhaPesquisaBD> listarLinhaPesquisa() {      
        List<LinhaPesquisaBD> listaFiltro = new ArrayList<LinhaPesquisaBD>(); 
        try { 
            Connection con = conBD.conectar();

            BDLp = con.createStatement();

            //busca todas as áreas cadastradas
            rs = BDLp.executeQuery("select * from linhapesquisa "
                    + " order by(cod_linhapesquisa)");

            if (rs != null) { 
                while (rs.next()) { 
                    LinhaPesquisaBD lp = new LinhaPesquisaBD();
                    //seta valores de código e nome
                    lp.setCodigo(rs.getInt("cod_linhapesquisa"));
                    lp.setNomeLinhaPesquisa(rs.getString("nome_linhapesquisa"));
                    listaFiltro.add(lp); 
                }
                return listaFiltro; 
            }else { 
                return null; 
            } 
        } catch (SQLException e) { 
            return null; 
        } 
    }

    public boolean inserirLinhaPesquisa(LinhaPesquisaBD lp){
        try
        {
            Connection con = conBD.conectar();
            boolean vnome;

            //verifica nome duplicado => False: Está duplicado, True: Não duplicado
            vnome = metBD.unique("linhapesquisa", "nome_linhapesquisa", lp.getNomeLinhaPesquisa());

            if(vnome){
                BDLp = con.createStatement();
                BDLp.execute("INSERT INTO linhapesquisa VALUES "
                        + "('"+lp.getCodigo()+"', '"+lp.getNomeLinhaPesquisa()+"' );");

                JOptionPane.showMessageDialog(null,"Cadastro realizado com sucesso.",
                        "Cadastro", JOptionPane.INFORMATION_MESSAGE);

                con.close();
                return true;    
            }
            else //Nome duplicado
            {
                JOptionPane.showMessageDialog(null,"Já existe linha de pesquisa com este nome.", 
                        "Linha de pesquisa duplicada", 
                        JOptionPane.ERROR_MESSAGE);
                con.close();
                return false;
            }
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco.", 
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);     
        }       
        return false;
    }

    public boolean excluirLinhaPesquisa(int codigoEnviado){
        String sql = "delete from linhapesquisa where cod_linhapesquisa = ?";   

        try {
            Connection con = conBD.conectar();

            //Verifica se area que foi ENVIADO é usado para alguma tese
            BDLp = con.createStatement();
            rs = BDLp.executeQuery("SELECT count(cod_linhapesquisa) "
                    + " from tese "
                    + " where cod_linhapesquisa = '"+codigoEnviado+"' ");
            rs.last();
            int capturaDisciplina = rs.getInt(1);

            if(capturaDisciplina >= 1){ //Possui FK's?
                    JOptionPane.showMessageDialog(null,"Linha de Pesquisa esta "
                            + " ligada a tese, não pode ser excluída.", 
                            "Excluir", JOptionPane.INFORMATION_MESSAGE);   
                con.close();
                return false;              
            }
            else{
                PreparedStatement ps = con.prepareStatement(sql);
                ps.setString(1, (String.valueOf(codigoEnviado)));
                if (ps.executeUpdate() > 0) {
                    con.close();
                    return true;
                } else {
                    con.close();
                    return false;
                }               
            }

        } catch (SQLException e) {
                JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco.", 
                "Erro no banco", JOptionPane.ERROR_MESSAGE);
                return false;
        }
    }
    
    public boolean alterarLinhaPesquisa(LinhaPesquisaBD lp){
        String sql = "update linhapesquisa set nome_linhapesquisa = ?";
        sql += " where cod_linhapesquisa = ?";

        try {
            // obtem conexão
            Connection con = conBD.conectar();
            BDLp = con.createStatement();
            
            //Obtem o nome da linha de pesquisa que foi ENVIADA para alteração
            rs = BDLp.executeQuery("SELECT nome_linhapesquisa from linhapesquisa"
                    + " where cod_linhapesquisa = '"+lp.getCodigo()+"'");
            rs.first();
            String capturaLP= rs.getString("nome_linhapesquisa");


            if(metBD.unique("linhapesquisa", "nome_linhapesquisa", lp.getNomeLinhaPesquisa()) || capturaLP.equals(lp.getNomeLinhaPesquisa())) // Deixa Cadastrar
            {
                PreparedStatement ps = con.prepareStatement(sql);
                ps.setString(1, lp.getNomeLinhaPesquisa());
                ps.setString(2, (String.valueOf(lp.getCodigo())));
                if (ps.executeUpdate() > 0) {
                    JOptionPane.showMessageDialog(null,"Alteração realizada com sucesso.",
                            "Alterar", JOptionPane.INFORMATION_MESSAGE);
                    con.close();
                return true;
                } else {
                    JOptionPane.showMessageDialog(null,"Não foi possível realizar a alteração.",
                            "Erro em alterar", JOptionPane.ERROR_MESSAGE);
                    con.close();
                return false;
                }     
            }
            else{
                JOptionPane.showMessageDialog(null,"Já existe linha de pesquisa com este nome.", 
                        "Linha de pesquisa duplicada", JOptionPane.INFORMATION_MESSAGE);
                return false;
            }
      }catch (SQLException e) {
            JOptionPane.showMessageDialog(null,e.getMessage(),
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false;
      }
    }

    public List<LinhaPesquisaBD> carregarComboLinhaPesquisa(){
        List<LinhaPesquisaBD> listalp = new ArrayList<LinhaPesquisaBD>(); //Lista para Codigo + nome
        try
        {      
            Connection con = conBD.conectar();         
            BDLp = con.createStatement();
            rs = BDLp.executeQuery("SELECT cod_linhapesquisa, nome_linhapesquisa "
                    + " from linhapesquisa ");
            
            LinhaPesquisaBD selecioneLinhaPesquisa = new LinhaPesquisaBD();
            selecioneLinhaPesquisa.setCodigo(-1);
            selecioneLinhaPesquisa.setNomeLinhaPesquisa("-- Selecione uma linha de pesquisa --");
            listalp.add(selecioneLinhaPesquisa);
            
            while(rs.next()){
                LinhaPesquisaBD lp = new LinhaPesquisaBD();
                lp.setCodigo(rs.getInt("cod_linhapesquisa"));
                lp.setNomeLinhaPesquisa(rs.getString("nome_linhapesquisa"));
                listalp.add(lp);
            }  
            con.close();  
            return listalp;
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), 
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
        }
        return listalp;
        }
}
